home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: VIDEO.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para el control de la pantalla y la visualización de
- las imágenes.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <graphics.h>
- #include <dos.h>
- #include <mem.h>
- #include <conio.h>
- #include <alloc.h>
- #include <bios.h>
- #include <string.h>
-
- #include "global.h"
- #include "memoria.h"
- #include "video.h"
- #include "menu.h"
- #include "teclas.h"
- #include "raton.h"
- #include "error.h"
-
-
- /*---- ESTRUCTURAS, CONSTANTES Y VARIABLES LOCALES AL MODULO -----------------*/
-
- /* dimensiones de la pantalla */
- static int ancho,alto;
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
- void VIDEOverMONO(IMAGEN *c,int x,int y);
- void VIDEOverEGA(IMAGEN *c,int x,int y);
- void VIDEOverVGA(IMAGEN *c,int x,int y);
-
- void VIDEOponerPaleta(char *p,int colores,int modo);
- void CrearPaletaGris(char *p,int colores);
-
- void VIDEOmodoVGA(void);
-
- char *ByteInvertir(char *b);
- void cambiar(char *a,char *b);
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern int VIDEOiniciar(void) ----------------------------------
-
- Descripción:
-
- Esta función inicializa el modo gráfico VGA 640x480, 16 colores
- que es el modo de video del interface ofrecido por el programa.
-
- Retorno:
-
- - 1 si se inicializa
- - 0 si hay error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int VIDEOiniciar(void)
- {
- int d=VGA,m=VGAHI;
-
- /* iniciar modo gráfico */
- registerbgidriver(EGAVGA_driver);
- initgraph(&d,&m,"");
- if(graphresult() != grOk)
- return(0);
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void VIDEOcerrar(void) ----------------------------------
-
- Descripción:
-
- Esta función deshabilita el modo de video gráfico para volver al DOS
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- /* deshabilitar video */
- extern void VIDEOcerrar(void)
- {
- /* volver a modo texto */
- closegraph();
- textmode(C80);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int VIDEOver(IMAGEN *c) ---------------------------------
-
- Descripción:
-
- Esta función muestra una imagen en la pantalla, usando su paleta.
- Si no tiene paleta de colores, se crea una paleta de grises y se
- usa.
-
- Parámetros:
-
- IMAGEN *c : puntero a la imagen
-
- Retorno:
-
- - 1 si la visualiza
- - 0 si no hay imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- /* visualizar imagen */
- extern int VIDEOver(IMAGEN *c)
- {
- /* coordenadas de visualización de la esquina superior izquierda */
- int x=0,y=0;
- /* bandera para abandonar la visualización */
- char fin=0;
- /* paso de visualización */
- int paso = 8;
-
- /* evento leído */
- struct EVENTO evento;
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- return(0);
- }
-
- /* establecer dimensiones y paleta segun el modo */
- switch(c->modo)
- {
- case VIDEOmono: ancho = 640;alto=480;
- break;
-
- case VIDEOega: ancho = 640;alto=480;
-
- if(!c->haypaleta)
- CrearPaletaGris(c->paleta,c->colores);
- VIDEOponerPaleta(c->paleta,c->colores,VIDEOega);
- break;
-
- case VIDEOvga: ancho = 320;alto=200;
- VIDEOmodoVGA();
- if(!c->haypaleta)
- CrearPaletaGris(c->paleta,c->colores);
- VIDEOponerPaleta(c->paleta,c->colores,VIDEOvga);
- break;
- };
-
- do
- {
- /* visualizar imagen desde coordenadas (x,y) */
- switch(c->modo)
- {
- case VIDEOmono:VIDEOverMONO(c,x,y);break;
- case VIDEOega:VIDEOverEGA(c,x,y);break;
- case VIDEOvga:VIDEOverVGA(c,x,y);break;
- };
-
- /* leer evento para desplazamientos de la imagen */
- evento = leer_evento(evento);
- switch(evento.e)
- {
- /* salir */
- case ESC:
- case RATON_DCHO_ON:
- case RATON_IZDO_ON:fin++;
- break;
-
- /* tecla arriba, desplaza paso abajo */
- case ARRIBA:
- if((y-paso)>0) y-=paso;
- else y=0;
- break;
- /* tecla abajo, desplaza paso arriba */
- case ABAJO:
- if((y+paso+alto) < c->alto) y+=paso;
- else
- if(c->alto > alto) y=c->alto-alto;
- else y=0;
- break;
- /* tecla izquierda, desplaza paso derecha */
- case IZQ:
- if((x-paso)>0) x-=paso;
- else x=0;
- break;
- /* tecla derecha, desplaza paso izquierda */
- case DER:
- if((x+paso+ancho) < c->ancho) x+=paso;
- else
- if(c->ancho > ancho) x=c->ancho-ancho;
- else x=0;
- break;
- /* tecla origen, esquina superior izquierda */
- case ORIGEN:
- x=y=0;
- break;
- /* tecla fin, esquina inferior derecha */
- case FIN:
- if(c->ancho > ancho) x=c->ancho-ancho;
- else x=0;
- if(c->alto > alto) y=c->alto-alto;
- else y=0;
- break;
- /* tecla pagina arriba, borde superior */
- case PGARR:
- y=0;
- break;
- /* tecla pagina abajo, borde inferior */
- case PGABJ:
- if(c->alto > alto) y=c->alto-alto;
- else y=0;
- break;
- /* otro caso, continuar */
- default:break;
- };
- }
- while(!fin);
- setgraphmode(VGAHI);
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern IMAGEN *VIDEOvision(IMAGEN *c) --------------------------
-
- Descripción:
-
- Esta función cambia, si es posible, el modo de visualización de una imagen.
-
- Parámetros:
-
- IMAGEN *c : puntero a la imagen
-
- Retorno:
-
- Puntero a la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *VIDEOvision(IMAGEN *c)
- {
- /* imagen destino */
- IMAGEN *e = NULL;
- /* contador */
- register int i;
- /* buffers */
- char buffer[ANCHO_MAXIMO];
- char bufferVGA[ANCHO_MAXIMO];
-
- /* reservar memoria para la cabecera de trabajo */
- if((e=MEMreservarCAB(e))==NULL)
- {
- ERRORponer(ERRnoMemoria);
- return(c);
- }
-
- /* cargar cabecera de trabajo */
- if(c->haypaleta)
- memcpy(e->paleta,c->paleta,c->colores*3);
- strcpy(e->nombre,c->nombre);
- e->ancho = c->ancho;
- e->alto = c->alto;
- e->formato = c->formato;
- e->colores = c->colores;
- e->haypaleta = c->haypaleta;
-
- switch(c->modo)
- {
- /* MONO a VGA */
- case VIDEOmono:
- e->modo = VIDEOvga;
- e->bytes = e->ancho;
- e->haypaleta = 1;
- if(!MEMreservar(e))
- {
- e =MEMliberar(e);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- memcpy(e->paleta,"\x0\x0\x0\xFF\xFF\xFF",6);
- for(i=0;i<c->alto;++i)
- {
- MEMleer(buffer,i,c);
- /* convierte a VGA */
- MONOaVGA(buffer,bufferVGA,c->ancho);
- /* escribe linea */
- MEMescribir(bufferVGA,i,e);
- }
- break;
-
- /* EGA a VGA */
- case VIDEOega:
- e->bytes = e->ancho;
- e->modo = VIDEOvga;
- if(!MEMreservar(e))
- {
- e =MEMliberar(e);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- for(i=0;i<c->alto;++i)
- {
- MEMleer(buffer,i,c);
- /* convierte a VGA */
- EGAaVGA(buffer,bufferVGA,c->ancho);
- /* escribe linea */
- MEMescribir(bufferVGA,i,e);
- }
- break;
-
- case VIDEOvga:
- if(c->colores > 16)
- {
- e =MEMliberar(e);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- /* VGA a EGA */
- if(c->colores > 2)
- {
- e->bytes = DePixelsABytes(e->ancho)*4;
- e->modo = VIDEOega;
- if(!MEMreservar(e))
- {
- e =MEMliberar(e);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- for(i=0;i<c->alto;++i)
- {
- MEMleer(bufferVGA,i,c);
- /* convierte a EGA */
- VGAaEGA(bufferVGA,buffer,c->ancho);
- /* escribe linea */
- MEMescribir(buffer,i,e);
- }
- }
- else
- /* VGA a MONO */
- {
- e->bytes = DePixelsABytes(e->ancho);
- e->modo = VIDEOmono;
- if(!MEMreservar(e))
- {
- e =MEMliberar(e);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- for(i=0;i<c->alto;++i)
- {
- MEMleer(bufferVGA,i,c);
- /* convierte a EGA */
- VGAaMONO(bufferVGA,buffer,c->ancho);
- /* escribe linea */
- MEMescribir(buffer,i,e);
- }
- }
- break;
- };
- c = MEMliberar(c);
- c = NULL;
- return(e);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern IMAGEN *VIDEOinvertirHorizontal(IMAGEN *c) --------------
-
- Descripción:
-
- Esta función refleja una imagen de izquierda a derecha
-
- Parámetros:
-
- IMAGEN *c : Puntero a la imagen
-
- Retorno:
-
- Puntero a la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *VIDEOinvertirHorizontal(IMAGEN *c)
- {
- /* contador */
- register int i;
- /* buffer */
- char buffer[ANCHO_MAXIMO];
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- return(c);
- }
- /* para cada línea, leerla, invertirla y escribirla */
- for(i=0;i<c->alto;++i)
- {
- MEMleer(buffer,i,c);
- memcpy(buffer,VIDEOinvertirLinea(c,buffer),c->ancho);
- MEMescribir(buffer,i,c);
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern IMAGEN *VIDEOinvertirVertical(IMAGEN *c) ----------------
-
- Descripción:
-
- Esta función refleja una imagen de arriba a abajo
-
- Parámetros:
-
- IMAGEN *c : Puntero a la imagen
-
- Retorno:
-
- Puntero a la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *VIDEOinvertirVertical(IMAGEN *c)
- {
- /* contador */
- register int i;
- /* buffers */
- char buffer1[ANCHO_MAXIMO];
- char buffer2[ANCHO_MAXIMO];
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- return(c);
- }
-
- /* intercambiar las líneas */
- for(i=0;i<c->alto/2;++i)
- {
- MEMleer(buffer1,i,c);
- MEMleer(buffer2,c->alto-1-i,c);
- MEMescribir(buffer1,c->alto-1-i,c);
- MEMescribir(buffer2,i,c);
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern char *VIDEOinvertirLinea(IMAGEN *c,char *linea) ---------
-
- Descripción:
-
- Esta función refleja una línea de derecha a izquierda
-
- Parámetros:
-
- IMAGEN *c : Puntero a la imagen
- char *linea : puntero al buffer que guarda la línea
-
- Retorno:
-
- Puntero al buffer de la linea reflejada
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern char *VIDEOinvertirLinea(IMAGEN *c,char *linea)
- {
- /* contadores */
- register int i,j;
- /* fin del bucle */
- register int fin;
- /* desplazamiento para líneas EGA */
- int desp;
- switch(c->modo)
- {
- /* intercambiar bytes e invertirlos */
- case VIDEOmono:
- fin = c->bytes/2;
- for(j=0;j<fin;j++)
- cambiar(ByteInvertir(linea+j),ByteInvertir(linea+c->bytes-1-j));
- break;
- /* intercambiar bytes e invertirlos para cada plano */
- case VIDEOega:
- desp = c->bytes/4;
- fin = desp/2;
- for(i=0;i<4;i++)
- for(j = 0; j < fin; ++j)
- cambiar(ByteInvertir(linea+i*desp+j),ByteInvertir(linea+(i+1)*desp-1-j));
- break;
- /* intercambiar bytes */
- case VIDEOvga:
- fin = c->ancho/2;
- for(j=0;j<=fin;j++)
- cambiar(linea+j,linea+c->ancho-1-j);
- break;
- }
- return(linea);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern IMAGEN *IMAGENduplicar(IMAGEN *c) -----------------------
-
- Descripción:
-
- Esta función crea una copia de una imagen
-
- Parámetros:
-
- IMAGEN *c : Puntero a la imagen
-
- Retorno:
-
- Puntero a la imagen
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *IMAGENduplicar(IMAGEN *c)
- {
- /* puntero a la imagen a duplicar */
- IMAGEN *d=NULL;
- /* buffer de línea */
- char buffer[ANCHO_MAXIMO];
- /* contador */
- register int i;
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- return(c);
- }
- /* reservar memoria para la cabecera de trabajo */
- if((d=MEMreservarCAB(d))==NULL)
- {
- ERRORponer(ERRnoMemoria);
- return(NULL);
- }
-
- /* cargar cabecera de trabajo */
- strcpy(d->nombre,c->nombre);
- d->ancho = c->ancho;
- d->alto = c->alto;
- d->bytes = c->bytes;
- d->formato = c->formato;
- d->modo = c->modo;
- d->colores = c->colores;
- d->haypaleta = c->haypaleta;
- if(c->haypaleta) memcpy(d->paleta,c->paleta,c->colores*3);
-
- /* si no hay memoria para la imagen, liberar cabecera */
- if(!MEMreservar(d))
- {
- d =MEMliberar(d);
- ERRORponer(ERRnoMemoria);
- return(d);
- }
- for(i=0;i<d->alto;++i)
- {
- MEMleer(buffer,i,c);
- MEMescribir(buffer,i,d);
- }
- return(d);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void MONOaVGA(char *mono,char *vga,int pixels) ----------
-
- Descripción:
-
- Esta función convierte una linea monocroma (1 bit/pixel)
- a vga (8 bits/pixel)
-
- Parámetros:
-
- char *mono : buffer de la línea monocroma
- char *vga : buffer de la línea vga
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void MONOaVGA(char *mono,char *vga,int pixels)
- {
- /* contador de pixels */
- register int i;
-
- memset(vga,0,ANCHO_MAXIMO);
- for(i=0;i<pixels;++i)
- if(mono[i/8] & (0x80 >> (i&7)))
- vga[i]++;
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void VGAaMONO(char *vga,char *mono,int pixels) ----------
-
- Descripción:
-
- Esta función convierte una linea vga (8 bits/pixel)
- a monocroma (1 bit/pixel)
-
- Parámetros:
-
- char *vga : buffer de la línea vga
- char *mono : buffer de la línea monocroma
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void VGAaMONO(char *vga,char *mono,int pixels)
- {
- /* contador de pixels */
- register int i;
-
- memset(mono,0,ANCHO_MAXIMO);
- for(i=0;i<pixels;++i)
- if(vga[i])
- mono[i/8] |= (0x80 >> (i & 0x07));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void EGAaVGA(char *ega,char *vga,int pixels) ------------
-
- Descripción:
-
- Esta función convierte una linea ega (4 bits/pixel en 4 planos)
- a vga (8 bits/pixel)
-
- Parámetros:
-
- char *ega : buffer de la línea ega
- char *vga : buffer de la línea vga
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void EGAaVGA(char *ega,char *vga,int pixels)
- {
- /* contadores de pixels y de planos */
- register int i,j;
- /* desplazamiento del plano */
- register int plano;
-
- plano = DePixelsABytes(pixels);
- memset(vga,0,ANCHO_MAXIMO);
- for(j=0;j<4;++j)
- for(i=0;i<pixels;++i)
- if( (ega[(j*plano)+(i/8)] >> (7-i&7)) & 1)
- vga[i] |= 1 << j;
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void VGAaEGA(char *vga,char *ega,int pixels) ----------
-
- Descripción:
-
- Esta función convierte una linea vga (8 bits/pixel)
- a ega (4 bits/pixel en cuatro planos)
-
- Parámetros:
-
- char *vga : buffer de la línea vga
- char *ega : buffer de la línea ega
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void VGAaEGA(char *vga,char *ega,int pixels)
- {
- /* contadores de pixels y de planos */
- register int i,j;
- /* desplazamiento del plano */
- register int plano;
-
- memset(ega,0,ANCHO_MAXIMO);
- plano = DePixelsABytes(pixels);
- for(j=0;j<4;++j)
- for(i=0;i<pixels;++i)
- if(vga[i] & (1<<j))
- ega[(j*plano)+(i/8)] |= (0x80 >> (i & 0x07));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void EGAdePlanoaPixel(char *fuente, ---------
- char *destino,int pixels)
-
- Descripción:
-
- Esta función convierte una linea ega por planos a ega por pixel
-
- Parámetros:
-
- char *origen : buffer de la línea origen
- char *destino : buffer de la línea destino
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void EGAdePlanoaPixel(char *fuente,char *destino,int pixels)
- {
- /* contadores de pixels y de planos */
- register int i,j;
- /* desplazamiento del plano */
- register int plano;
-
- plano = DePixelsABytes(pixels);
- memset(destino,0,ANCHO_MAXIMO);
- for(j=0;j<4;++j)
- for(i=0;i<pixels;++i)
- if((fuente[(j*plano)+(i/8)] >> (7-i&7)) & 1)
- destino[i>>1] |= (0x10 << j) >> (4*(i&1));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void VGAdePlanoaPixel(char *fuente, ---------
- char *destino,int pixels)
-
- Descripción:
-
- Esta función convierte una linea vga por planos a vga por pixel
-
- Parámetros:
-
- char *origen : buffer de la línea origen
- char *destino : buffer de la línea destino
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void VGAdePlanoaPixel(char *fuente,char *destino,int pixels)
- {
- /* contadores de pixels y de planos */
- register int i,j;
- /* desplazamiento del plano */
- register int plano;
-
- plano = pixels/8;
- memset(destino,0,ANCHO_MAXIMO);
- for(j=0;j<8;++j)
- for(i=0;i<pixels;++i)
- if( (fuente[(j*plano)+(i/8)] >> (7-i&7)) & 1)
- destino[i] |= 0x80 >> j;
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void VGAdePixelaPlano(char *fuente, ---------
- char *destino,int pixels)
-
- Descripción:
-
- Esta función convierte una linea vga por pixel a vga por plano
-
- Parámetros:
-
- char *origen : buffer de la línea origen
- char *destino : buffer de la línea destino
- pixels : número de pixels de la línea
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void VGAdePixelaPlano(char *fuente,char *destino,int pixels)
- {
- /* contadores de pixels y de planos */
- register int i,j;
- /* desplazamiento del plano */
- register int plano;
-
- memset(destino,0,ANCHO_MAXIMO);
- plano = pixels/8;
- for(j=0;j<8;++j)
- for(i=0;i<pixels;++i)
- if(fuente[i] & (0x80>>j))
- destino[(j*plano)+(i/8)] |= (0x80 >> (i&7));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern char *VIDEOinvertirPaleta(char *paleta,int colores) -----
-
- Descripción:
-
- Esta función transforma una paleta RGB en BGR o viceversa
-
- Parámetros:
-
- char *paleta : puntero a la paleta
- int colores : número de colores de la paleta
-
- Retorno:
-
- Paleta convertida
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern char *VIDEOinvertirPaleta(char *paleta,int colores)
- {
- /* contador de colores */
- register int i;
- /* puntero auxiliar a paleta */
- register char *p;
-
- for(i=0,p = paleta;i<colores;++i,p+=3)
- cambiar(p,p+2);
- return(paleta);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern unsigned int DepixelsABytes(unsigned int n) -------------
-
- Descripción:
-
- Esta función devuelve el número de bytes necesarios para guardar un número
- de pixels usando 8 bits por pixel.
-
- Parámetros:
-
- unsigned int n : número de pixels
-
- Retorno:
-
- Número de bytes
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern unsigned int DePixelsABytes(unsigned int n)
- {
- /* si no es múltiplo de 8 */
- if(n & 0x0007)
- return((n >> 3)+1);
- else
- /* si lo es */
- return(n >> 3);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
- /*---- FUNCION: void VIDEOverMONO(IMAGEN *c,int x,int y) -----------------------
-
- Descripción:
-
- Esta función visualiza un area de una imagen monocroma, desde un par de
- coordenadas (x,y)
-
- Parámetros:
-
- IMAGEN *c : puntero a la imagen
- int x : coordenada izquierda del area a visualizar
- int y : coordenada superior del area a visualizar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
-
- void VIDEOverMONO(IMAGEN *c,int x,int y)
- {
- /* contador lineas */
- register int i;
- /* buffer de linea */
- char p[ANCHO_MAXIMO];
- /* lineas visibles */
- int lineas;
-
- /* limpiar linea */
- memset(p,0,ANCHO_MAXIMO);
- /* establecer lineas visibles */
- lineas = (c->alto < alto) ? c->alto:alto;
- /* visualizar imagen */
- for(i=0;i<lineas;++i)
- {
- MEMleer(p,y++,c);
- memcpy(MK_FP(0xa000,i*80),p+x,80);
- if(c->bytes < 80)
- memset(MK_FP(0xa000,i*80+c->bytes),0,80-c->bytes);
- }
- /* limpiar el resto de la pantalla */
- if(lineas<alto)
- memset(MK_FP(0xa000,lineas*80),0,80*(alto-lineas));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void VIDEOverEGA(IMAGEN *c,int x,int y) ------------------------
-
- Descripción:
-
- Esta función visualiza un area de una imagen ega, desde un par de
- coordenadas (x,y)
-
- Parámetros:
-
- IMAGEN *c : puntero a la imagen
- int x : coordenada izquierda del area a visualizar
- int y : coordenada superior del area a visualizar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void VIDEOverEGA(IMAGEN *c,int x,int y)
- {
- /* contador de lineas */
- register int i;
- /* contador de planos */
- register int j;
- /* buffer de linea */
- char p[ANCHO_MAXIMO];
- /* bytes por linea para cada plano */
- int bytes;
- /* lineas visibles */
- int lineas;
-
- /* limpiar buffer */
- memset(p,0,ANCHO_MAXIMO);
- /* calculo de lineas visibles */
- lineas = (c->alto < alto) ? c->alto:alto;
- /* en cada linea de memoria hay 4 planos */
- bytes = (c->bytes/4 > 80) ? 80 : c->bytes/4;
- /* visualizar imagen */
- for(i = 0; i<lineas;++i)
- {
- /* leer linea que contiene los 4 planos consecutivamente */
- MEMleer(p,y++,c);
- /* para cada plano...*/
- for(j=0;j<4;j++)
- {
- /* seleccionar plano */
- outportb(0x3c4,2);outportb(0x3c5,1<<j);
- /* escribir */
- memcpy(MK_FP(0xa000,i*80),p+(j*(c->bytes/4)+x/8),bytes);
- if(bytes < 80)
- memset(MK_FP(0xa000,i*80+bytes),0,80-bytes);
- }
- }
-
- /* limpiar el resto de la pantalla */
- if(lineas<alto)
- for(j=0;j<4;j++)
- {
- outportb(0x3c4,2);outportb(0x3c5,1<<j);
- memset(MK_FP(0xa000,lineas*80),0,80*(alto-lineas));
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void VIDEOverVGA(IMAGEN *c,int x,int y) ------------------------
-
- Descripción:
-
- Esta función visualiza un area de una imagen vga, desde un par de
- coordenadas (x,y)
-
- Parámetros:
-
- IMAGEN *c : puntero a la imagen
- int x : coordenada izquierda del area a visualizar
- int y : coordenada superior del area a visualizar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void VIDEOverVGA(IMAGEN *c,int x,int y)
- {
- /* contador de lineas */
- register int i;
- /* buffer de linea */
- char p[ANCHO_MAXIMO];
- /* lineas visibles */
- int lineas;
-
- /* calcular lineas visibles */
- lineas = (c->alto < alto) ? c->alto:alto;
- /* limpiar buffer */
- memset(p,0,ANCHO_MAXIMO);
- /* visualizar imagen */
- for(i = 0; i < lineas ; ++i)
- {
- MEMleer(p,y++,c);
- memcpy(MK_FP(0xa000,i*ancho),p+x,ancho);
-
- if(c->bytes < ancho)
- memset(MK_FP(0xa000,i*ancho+c->bytes),0,ancho-c->bytes);
- }
- /* limpiar el resto de la pantalla */
- if(lineas<alto)
- memset(MK_FP(0xa000,lineas*ancho),0,ancho*(alto-lineas));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void VIDEOponerPaleta(char *p,int colores,int modo) ------------
-
- Descripción:
-
- Esta función establece la paleta de la imagen según el modo de vídeo
-
- Parámetros:
-
- char *p : puntero a la paleta
- int colores : número de colores de la paleta
- int modo : modo de vídeo
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void VIDEOponerPaleta(char *p,int colores,int modo)
- {
- /* contador de colores */
- register int i;
-
- switch(modo)
- {
- case VIDEOega:
- {
- /* paleta temporal */
- struct palettetype paleta;
-
- /* poner paleta */
- getpalette(&paleta);
- for(i=0;i<colores;++i)
- setrgbpalette(paleta.colors[i], p[i*3]>>2, p[i*3+1]>>2, p[i*3+2]>>2);
- }
- break;
-
- case VIDEOvga:
- {
- union REGS r;
- struct SREGS sr;
- /* paleta temporal */
- char p2[768];
-
- /* poner paleta */
- memcpy(p2,p,colores*3);
- for(i=0;i<3*colores;i++)
- *(p2+i) = (*(p2+i)) >> 2;
-
- r.x.ax = 0x1012;
- r.x.bx = 0;
- r.x.cx = colores;
- r.x.dx = FP_OFF(p2);
- sr.es= FP_SEG(p2);
- int86x(0x10,&r,&r,&sr);
- }
- break;
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void CrearPaletaGris(char *p,int colores) ----------------------
-
- Descripción:
-
- Esta función crea una paleta de grises usando un total de 256 tonalidades
-
- Parámetros:
-
- char *p : puntero a la paleta
- int colores : número de colores de la paleta
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void CrearPaletaGris(char *p,int colores)
- {
- /* contador y factor de gris */
- register int i,factor;
-
- /* calcular factor de gris */
- factor = 256/colores;
- /* crear paleta */
- for(i=0;i<colores;++i)
- memset(p+i*3,i*factor,3);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void VIDEOmodoVGA(void) ----------------------------------------
-
- Descripción:
-
- Esta función establece el modo VGA 320x200, 256 colores para permitir la
- visualización de imágenes en modo vga
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void VIDEOmodoVGA(void)
- {
- union REGS inregs,outregs;
-
- /* establecer modo VGA 320x200, 256 colores */
- inregs.x.ax = 0x0013;
- int86(0x10,&inregs,&outregs);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: char *ByteInvertir(char *b) ------------------------------------
-
- Descripción:
-
- Esta función invierte el orden de los bits de un byte
-
- Parámetros:
-
- char *b: puntero al byte
-
- Retorno:
-
- Puntero al byte
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- char *ByteInvertir(char *b)
- {
- /* contador */
- register int i;
- /* byte temporal */
- register char r=0;
-
- for(i=0;i<8;++i)
- r |= (((*b>>i)&1) << (7-i));
- *b=r;
- return(b);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void cambiar(char *a,char *b) ----------------------------------
-
- Descripción:
-
- Esta función intercambia los valores de dos bytes
-
- Parámetros:
-
- char *a: puntero al primer byte
- char *b: puntero al segundo byte
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void cambiar(char *a,char *b)
- {
- /* variable temporal */
- char aux;
-
- /* intercambio */
- aux = *a;
- *a = *b;
- *b = aux;
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
-